#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //在构造函数里创建和初始化数据库
    //添加数据库驱动                             数据库类型  连接字
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("information.db");//设置数据库路径
    if(!db.open())//打开数据库，并判断是否打开成功
    {
        qDebug()<<"open error";
    }

    //创建表格
    //sql语句
    QString sql = QString("create table Information(name varchar(8)  not null,native_place varchar(8),sex varchar(8) ,birthday varchar(8),nation varchar(8),class varchar(8),telephone varchar(8),address varchar(8),hobby varchar(8),qqnum varchar(8),pecialty varchar(8),synopsis varchar(8),picture varchar(128))");
    QSqlQuery query(QSqlDatabase::database("HD"));//访问连接字为"HD"数据库    用sql语句访问数据库

    if(!query.exec(sql))//执行sql语句  并判断是否成功
    {
        qDebug()<<"create error";
    }

    //关联读数据信号
    connect(&msocket, &QUdpSocket::readyRead, this, &MainWindow::read_data);

    //隐藏相关表格
    ui->tableView->hide();
    ui->pushButton_4->hide();
    ui->pushButton_5->hide();
    ui->pushButton_6->hide();
    ui->pushButton_7->hide();
    ui->pushButton_8->hide();
    ui->lineEdit_13->hide();
    ui->lineEdit_14->hide();
    ui->lineEdit_15->hide();

    //细节优化
    this->setWindowTitle("企业实训项目（服务器端）");//添加标题
    this->setWindowIcon(QIcon(":/photo/123.jpg"));//添加图标
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //绑定            电脑中的任意ip地址               端口号
    msocket.bind(QHostAddress::AnyIPv4, ui->lineEdit_16->text().toUShort());
}

//当有数据过来时，会执行这个槽函数
void MainWindow::read_data()
{
    //读取数据
    char buffer[1024]={0};
    QString str[12];
    QLineEdit *p[12] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12};
    //清空输入数据
    for (int i = 0; i < 12; ++i) {
        p[i]->clear();
    }
    ui->label_14->clear();
    //将信息存入json对象中
   // QHostAddress address;
    //quint16 port;
   // msocket.readDatagram(buffer, 1024, &address, &port);//如果想得到对方的ip加端口号，用这个

   msocket.readDatagram(buffer, 1024, nullptr, nullptr);//只是接收数据，不想知道对方的ip加端口号用这个
    qDebug()<<buffer;//打印接收到的数据
//    ui->textEdit->setText(buffer);
    //得到存放json格式数据buffer，将buffer解包
    QByteArray byte_array;//数组
    QJsonParseError json_error;//json错误码
    QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(buffer),&json_error);//json读写对象

   if(json_error.error == QJsonParseError::NoError)//解析成功
   {
       QJsonObject obj = parse_doucment.object();//通过json读写对象得到json对象obj

       QJsonValue desc = obj.take("type");//通过json对象的键值，得到该键值对应的json值
       if(desc.toString()=="information")//toString是将json格式的数据转换成String格式
       {
           desc = obj.take("s1");//得到键值s1对应的json值
            str[0]=desc.toString();
            desc = obj.take("s2");
            str[1]=desc.toString();
            desc = obj.take("s3");
            str[2]=desc.toString();
            desc = obj.take("s4");
            str[3]=desc.toString();
            desc = obj.take("s5");
            str[4]=desc.toString();
            desc = obj.take("s6");
            str[5]=desc.toString();
            desc = obj.take("s7");
            str[6]=desc.toString();
            desc = obj.take("s8");
            str[7]=desc.toString();
            desc = obj.take("s9");
            str[8]=desc.toString();
            desc = obj.take("s10");
            str[9]=desc.toString();
            desc = obj.take("s11");
            str[10]=desc.toString();
            desc = obj.take("s12");
            str[11]=desc.toString();
            desc = obj.take("tupian");
            QString tupian =desc.toString();
            //将获取到的信息添加到数据库里
            QString sql = QString("insert into Information(name,native_place,sex,birthday,nation,"
                                  "class,telephone,address,hobby,qqnum,pecialty,synopsis,picture) "
                                  "values('%1','%2','%3','%4','%5','%6','%7'"
                                  ",'%8','%9','%10','%11','%12','%13')").arg(str[0]).arg(str[1]).arg(str[2]).arg(str[3]).arg(str[4]).arg(str[5]).arg(str[6]).arg(str[7]).arg(str[8]).arg(str[9]).arg(str[10]).arg(str[11]).arg(tupian);
            QSqlQuery query(sql);
            //创建数据模型(显示数据模型)(更新数据)
            model = new QSqlTableModel();
            model->setTable("Information");//给模型绑定数据表格
            ui->tableView->setModel(model);//把模型与显示view绑定
            model->select();//查询所有的数据

//            //填写数据
//            for (int i = 0; i < 12; ++i) {
//                p[i]->setText(str[i]);
//            }
//            desc = obj.take("tupian");
//            QString tupian =desc.toString();
//            //访问图片路径
//            QPixmap pix(tupian);

//            //获取label的宽高
//            int w=ui->label_14->width();
//            int h=ui->label_14->height();

//            //设置图片显示宽高
//            pix=pix.scaled(w,h);

//            //显示图片
//            ui->label_14->setPixmap(pix);
       }
   }

}

//跳到下一个用户数据（循环显示数据库里的数据信息（图形化））
void MainWindow::on_pushButton_2_clicked()
{
    static int num = 0;
    int j = 0;
    QLineEdit *p[12] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12};
    QString str[13];
    //获取数据库数据数量
    QString sql = QString("select count(*) from Information");
    QSqlQuery query(sql);
    query.next();
    j = query.value(0).toInt();

    if(num == j)
    {
        num = 0;
    }

    if(j != 0)
    {
        sql = QString("select * from Information");
        QSqlQuery query(sql);
        for (int s = 0; s < num+1; s++)
        {
            query.next();
        }
        //输出显示信息
        for (int s = 0; s < 12; ++s) {
            p[s]->setText(query.value(s).toString());
        }

        //显示图片
        QPixmap pix(query.value(12).toString());
        int w = ui->label_14->width();
        int h = ui->label_14->height();
        pix = pix.scaled(w,h);
        ui->label_14->setPixmap(pix);
        num++;
    }

}

//通过表格添加信息（添加按键一）
void MainWindow::on_pushButton_4_clicked()
{
    //显示相关界面（通过表格输入）
    QLineEdit *p[13] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12,ui->lineEdit_16};
    QLabel *q[13] = {ui->label_2,ui->label_3,ui->label_4,ui->label_5,ui->label_6,ui->label_7,ui->label_8,ui->label_9,ui->label_10,ui->label_11,ui->label_12,ui->label_13,ui->label_14};
    //显示相关按键
    for (int i = 0; i < 13; ++i) {
        p[i]->show();
    }
    for (int i = 0; i < 13; ++i) {
        q[i]->show();
    }
    ui->pushButton_7->show();
    ui->pushButton_8->show();
    //隐藏相关控键
    ui->tableView->hide();
    ui->lineEdit_13->hide();
    ui->lineEdit_14->hide();
    ui->lineEdit_15->hide();
    ui->lineEdit_16->hide();
    ui->pushButton_4->hide();
    ui->pushButton_5->hide();
    ui->pushButton_6->hide();

}

//添加按键2
void MainWindow::on_pushButton_7_clicked()
{
    QLineEdit *p[12] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12};
    QString str[12];
    for (int i = 0; i < 12; ++i) {
        str[i] = p[i]->text();
    }
    for (int i = 0; i < 12; ++i) {
        p[i]->clear();
    }
    QString sql = QString("insert into Information(name,native_place,sex,birthday,nation,"
                          "class,telephone,address,hobby,qqnum,pecialty,synopsis,picture) "
                          "values('%1','%2','%3','%4','%5','%6','%7'"
                          ",'%8','%9','%10','%11','%12','%13')").arg(str[0]).arg(str[1]).arg(str[2]).arg(str[3]).arg(str[4]).arg(str[5]).arg(str[6]).arg(str[7]).arg(str[8]).arg(str[9]).arg(str[10]).arg(str[11]).arg("");
    QSqlQuery query(sql);
    //创建数据模型(显示数据模型)
    model = new QSqlTableModel();
    model->setTable("Information");//给模型绑定数据表格
    ui->tableView->setModel(model);//把模型与显示view绑定
    model->select();//查询所有的数据
    on_pushButton_8_clicked();
}

//（不添加信息返回）返回
void MainWindow::on_pushButton_8_clicked()
{
    QLineEdit *p[13] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12,ui->lineEdit_16};
    QLabel *q[13] = {ui->label_2,ui->label_3,ui->label_4,ui->label_5,ui->label_6,ui->label_7,ui->label_8,ui->label_9,ui->label_10,ui->label_11,ui->label_12,ui->label_13,ui->label_14};
    //显示相关按键
    for (int i = 0; i < 13; ++i) {
        p[i]->hide();
    }
    for (int i = 0; i < 13; ++i) {
        q[i]->hide();
    }
    ui->pushButton_8->hide();
    ui->pushButton_7->hide();

    //显示相关按键
    ui->tableView->show();
    ui->pushButton_4->show();
    ui->pushButton_5->show();
    ui->pushButton_6->show();
//    ui->pushButton_7->show();
    ui->lineEdit_13->show();
    ui->lineEdit_14->show();
    ui->lineEdit_15->show();


}

//查询界面切换
void MainWindow::on_pushButton_3_clicked()
{
    QLineEdit *p[13] ={ui->lineEdit,ui->lineEdit_2,ui->lineEdit_3,ui->lineEdit_4,ui->lineEdit_5,ui->lineEdit_6,ui->lineEdit_7,ui->lineEdit_8,ui->lineEdit_9,ui->lineEdit_10,ui->lineEdit_11,ui->lineEdit_12,ui->lineEdit_16};
    QLabel *q[13] = {ui->label_2,ui->label_3,ui->label_4,ui->label_5,ui->label_6,ui->label_7,ui->label_8,ui->label_9,ui->label_10,ui->label_11,ui->label_12,ui->label_13,ui->label_14};
    QPushButton *r[3] = {ui->pushButton,ui->pushButton_2,ui->pushButton_3};

    //隐藏相关按键
    for (int i = 0; i < 13; ++i) {
        p[i]->hide();
        p[i]->clear();
    }
    for (int i = 0; i < 13; ++i) {
        q[i]->hide();
    }
    for (int i = 0; i < 3; ++i) {
        r[i]->hide();
    }
    ui->label_14->clear();
    //显示相关按键
    ui->tableView->show();
    ui->pushButton_4->show();
    ui->pushButton_5->show();
    ui->pushButton_6->show();
//    ui->pushButton_7->show();
    ui->lineEdit_13->show();
    ui->lineEdit_14->show();
    ui->lineEdit_15->show();

    //创建数据模型(显示数据模型)
    model = new QSqlTableModel();
    model->setTable("Information");//给模型绑定数据表格
    ui->tableView->setModel(model);//把模型与显示view绑定
    model->select();//查询所有的数据
}

//查询数据
void MainWindow::on_pushButton_6_clicked()
{
    QLineEdit *s[3] = {ui->lineEdit_13,ui->lineEdit_14,ui->lineEdit_15};
    bool chaxun = true;
    //查询输入框里是否有数据
    for (int i = 0; i < 3; ++i) {
        if(s[i]->text() != "")
        {
            //13姓名0 14性别1 15班级2
            chaxun = false;
            //进行查询
            if(i == 0)//姓名
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                model->setFilter(QString("name=='%1'").arg(s[i]->text()));
                s[i]->clear();
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            if(i == 1)//性别
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                model->setFilter(QString("sex=='%1'").arg(s[i]->text()));
                s[i]->clear();
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            if(i == 2)//班级
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                model->setFilter(QString("class=='%1'").arg(s[i]->text()));
                s[i]->clear();
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            break;
        }
    }
    //判断是否跟新数据，如果输入框里没有数据则显示所有数据
    if(chaxun)
    {
        //创建数据模型(显示数据模型)
        model = new QSqlTableModel();
        model->setTable("Information");//给模型绑定数据表格
        ui->tableView->setModel(model);//把模型与显示view绑定
        model->select();//查询所有的数据
    }
}


//删除操作
void MainWindow::on_pushButton_5_clicked()
{
    QLineEdit *s[3] = {ui->lineEdit_13,ui->lineEdit_14,ui->lineEdit_15};
    //查询输入框里是否有数据
    for (int i = 0; i < 3; ++i) {
        if(s[i]->text() != "")
        {
            //13姓名0 14性别1 15班级2
            //进行删除
            if(i == 0)//姓名
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                QString sql = QString("delete from Information where name='%1'").arg(s[i]->text());
                s[i]->clear();
                QSqlQuery query(sql);
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            if(i == 1)//性别
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                QString sql = QString("delete from Information where sex='%1'").arg(s[i]->text());
                s[i]->clear();
                QSqlQuery query(sql);
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            if(i == 2)//班级
            {
                //创建数据模型
                model = new QSqlTableModel();
                model->setTable("Information");//给模型绑定数据表格
                QString sql = QString("delete from Information where class='%1'").arg(s[i]->text());
                s[i]->clear();
                QSqlQuery query(sql);
                ui->tableView->setModel(model);//把模型与显示view绑定
                model->select();//查询所有的数据
            }
            break;
        }
    }
}
